package controller;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import model.entidades.Usuario;
import model.repositorio.UsuarioDAO;
import utils.Criptografia;
import utils.Validacao;
import view.usuario.TelaCadastrarUsuario;

public class ControladorUsuario {

	private TelaCadastrarUsuario tela;

	private UsuarioDAO usuarioDAO;

	final boolean VALIDO = false;
	final boolean INVALIDO = true;

	public ControladorUsuario(TelaCadastrarUsuario tela) {
		this.tela = tela;
		usuarioDAO = new UsuarioDAO();
	}

	public void salvar(Usuario usuario) throws ControladorExcecao {
		int contaErros = 0;
		if (usuario == null) {
			throw new ControladorExcecao(ControladorExcecao.USUARIO_NULO);
		} else {
			
			if(tela.getComboBoxRgUF().getSelectedIndex() == 0) {
				tela.mostraCampoInvalido(tela.getLblRg(), INVALIDO);
				throw new ControladorExcecao(ControladorExcecao.ERRO_RG_UF);
			} else {
				tela.mostraCampoInvalido(tela.getLblRg(), VALIDO);
			}
			
			String confirmaSenha = Criptografia.criptografaSenha(new String (tela.getTxtConfirmaSenha().getPassword()));

			if(usuario.getID() == 0 || usuario.getSenha().length() > 0){
				if(usuario.getSenha().length() > 0 ){
					tela.mostraCampoInvalido(tela.getLblSenha(), VALIDO);
					if(usuario.getSenha().equals(confirmaSenha)){
						tela.mostraCampoInvalido(tela.getLblConfirmacaoSenha(), VALIDO);
					} else {
						tela.mostraCampoInvalido(tela.getLblConfirmacaoSenha(), INVALIDO);
						throw new ControladorExcecao(ControladorExcecao.SENHAS_DIVERGENTE);
					}
				} else {
					contaErros++;
					tela.mostraCampoInvalido(tela.getLblSenha(), INVALIDO);
				}
			}

			if (usuario.getNome() != null && usuario.getNome().length() > 2) {
				tela.mostraCampoInvalido(tela.getLblNomeCompleto(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblNomeCompleto(), INVALIDO);
			}

			if (usuario.getDataNascimento() != null) {
				tela.mostraCampoInvalido(tela.getLblDataNascimento(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblDataNascimento(), INVALIDO);
			}

			if (usuario.getCpf() != null && usuario.getCpf().length() == 11) {
				tela.mostraCampoInvalido(tela.getLblCpf(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblCpf(), INVALIDO);
			}

			if (usuario.getLogin() != null && usuario.getLogin().length() > 0) {
				tela.mostraCampoInvalido(tela.getLblLogin(), VALIDO);
			} else {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblLogin(), INVALIDO);
			}

			if (usuario.getEmail().length() > 0 && !Validacao.verificaEmail(usuario.getEmail())) {
				contaErros++;
				tela.mostraCampoInvalido(tela.getLblEmail(), INVALIDO);
			} else {
				tela.mostraCampoInvalido(tela.getLblEmail(), VALIDO);
			}
		}

		if (contaErros > 0) {
			throw new ControladorExcecao(ControladorExcecao.ERRO_VALIDACAO);
		} else {
			Usuario usuarioTesteCPF = usuarioDAO.buscaPorCPF(usuario.getCpf());
			Usuario usuarioTesteLogin = usuarioDAO.buscaPorLogin(usuario.getLogin());
			if(usuarioTesteCPF == null || usuarioTesteCPF.getID() == usuario.getID()) {
				if(usuarioTesteLogin == null || usuarioTesteLogin.getID() == usuario.getID()) {
					usuarioDAO.salvar(usuario);
				} else {
					tela.mostraCampoInvalido(tela.getLblLogin(), INVALIDO);
					throw new ControladorExcecao(ControladorExcecao.LOGIN_USUARIO_CADASTRADO);
				}
			} else {
				tela.mostraCampoInvalido(tela.getLblCpf(), INVALIDO);
				throw new ControladorExcecao(ControladorExcecao.CPF_USUARIO_CADASTRADO);
			}			
		}
	}
	
	public void alterarSenha(Usuario usuario) {
		usuarioDAO.salvar(usuario);
	}

	public List<Usuario> pesquisarUsuario(String tipo, String situacao) throws ControladorExcecao {

		List<Usuario> lista = usuarioDAO.buscaPorParametros(tipo, situacao);

		if (lista == null) {
			throw new ControladorExcecao(ControladorExcecao.PESQUISA_USUARIO);
		} else {
			return lista;
		}

	}
	
	public Usuario pesquisarUsuarioLogin(String login) throws ControladorExcecao {

		Usuario usuario = usuarioDAO.buscaPorLogin(login);

		if (usuario == null) {
			throw new ControladorExcecao(ControladorExcecao.LOGIN_USUARIO_INVALIDO);
		} else {
			return usuario;
		}

	}
	
	public Set<Usuario> buscaProfissionaisNaoConveniados(Set<Usuario> listaUsuarios) {
		
		List<Usuario> list = usuarioDAO.buscaProfissionaisNaoConveniados(listaUsuarios);
		if (list == null) {
			Set<Usuario> lista = new HashSet<Usuario>();
			return lista;
		} else {
			Set<Usuario> lista = new HashSet<Usuario>();
			lista.addAll(list);
			return lista;
		}
	}
	
	public void reler(Usuario usuario){
		usuarioDAO.refresh(usuario);
	}

}